﻿using System;
using System.Collections.Generic;
using System.Text;

using System.Data;
using System.Data.Odbc;
using WLMCoreLibrary;
using System.Configuration;
using System.IO;
using System.Web;
using System.Drawing;
using System.Drawing.Imaging;


namespace SAW_Core
{
    public class MediaImage : BaseClass
    {

        #region public properties
        public String titulo { get; set; }
        public String descripcion { get; set; }
        public String archivo { get; set; }
        public int tamano { get; set; }
        public int idCategoria { get; set; }
        public int aspecto { get; set; }
        public string URLImagen
        {
            get
            {
                if (id != 0)
                    return ConfigurationManager.AppSettings["imagesPath"] + fechaCreacion.Year + "/" + fechaCreacion.Month + "/" + fechaCreacion.Day + "/" + archivo;
                else
                    return ConfigurationManager.AppSettings["imagesPath"] + "/imagenError.jpg";
            }
        }
        #endregion

        #region constructors
        public MediaImage(ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            WLMClassBinder classBinder = new WLMClassBinder(ref ConexionDB);
            id = classBinder.NewRecord("IMAGENES");
            string queryString = "";
            queryString = "SELECT * FROM IMAGENES WHERE id='" + this.id + "'";
            GetRecord(queryString);
        }

        public MediaImage(int registryId, ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM IMAGENES WHERE id='" + registryId + "'";

            this.GetRecord(queryString);
        }
        public MediaImage(DataRow dataRow, ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            this.GetRecord(dataRow);
        }
        #endregion

        #region public methods
        private ImageCodecInfo GetEncoder(ImageFormat format)
        {

            ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();

            foreach (ImageCodecInfo codec in codecs)
            {
                if (codec.FormatID == format.Guid)
                {
                    return codec;
                }
            }
            return null;
        }

        public string GetThumbNail(int thumbSize)
        {
            string path1 = ConfigurationManager.AppSettings["sitePath"];
            string nuevoNombreArchivo = archivo.Split('.')[0] + "_" + thumbSize.ToString() + "." + archivo.Split('.')[1];
            if (!File.Exists(path1 + ConfigurationManager.AppSettings["thumbsPath"] + nuevoNombreArchivo))
            {
                FileStream lecto = new FileStream(path1 + ConfigurationManager.AppSettings["imagesPath"] + fechaCreacion.Year + "/" + fechaCreacion.Month + "/" + fechaCreacion.Day + "/" + archivo, FileMode.Open);

                ResizeImage(lecto, nuevoNombreArchivo, ConfigurationManager.AppSettings["thumbsPath"].ToString(), thumbSize);
                lecto.Close();

            }
            return ConfigurationManager.AppSettings["thumbsPath"].ToString() + nuevoNombreArchivo;

        }

        private void ResizeImage(Stream streamFile, string fileName, string directoryName, int imageWidthResize)
        {
            string path1 = ConfigurationManager.AppSettings["sitePath"];

            //Bitmap bmp1 = new Bitmap(ConfigurationManager.AppSettings["sitePath"] + ConfigurationManager.AppSettings["imagesPath"] + _archivo);
            Bitmap bmp1 = new Bitmap(streamFile);

            //Or you do can use buil-in method
            //ImageCodecInfo jgpEncoder GetEncoderInfo("image/gif");//"image/jpeg",...
            ImageCodecInfo jgpEncoder = GetEncoder(ImageFormat.Jpeg);

            // Create an Encoder object based on the GUID
            // for the Quality parameter category.
            System.Drawing.Imaging.Encoder myEncoder =
            System.Drawing.Imaging.Encoder.Quality;

            // Create an EncoderParameters object.
            // An EncoderParameters object has an array of EncoderParameter
            // objects. In this case, there is only one
            // EncoderParameter object in the array.
            EncoderParameters myEncoderParameters = new EncoderParameters(1);

            EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 78L);
            myEncoderParameters.Param[0] = myEncoderParameter;



            System.IO.DirectoryInfo directorio = new System.IO.DirectoryInfo(path1 + directoryName);
            if (!directorio.Exists)
                directorio.Create();

            if (bmp1.Width > imageWidthResize)
            {
                if (fileName.Split('.')[fileName.Split('.').Length - 1] == "gif")
                {
                    jgpEncoder = GetEncoder(ImageFormat.Gif);
                }
                if (fileName.Split('.')[fileName.Split('.').Length - 1] == "png")
                {
                    jgpEncoder = GetEncoder(ImageFormat.Png);
                }
                int srcWidth = bmp1.Width;
                int srcHeight = bmp1.Height;

                Decimal sizeRatio = ((Decimal)srcHeight / srcWidth);
                int thumbHeight = Decimal.ToInt32(sizeRatio * imageWidthResize);

                Bitmap bmp = new Bitmap(imageWidthResize, thumbHeight);

                System.Drawing.Graphics gr = System.Drawing.Graphics.FromImage(bmp);

                gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                System.Drawing.Rectangle rectDestination = new System.Drawing.Rectangle(0, 0, imageWidthResize, thumbHeight);
                gr.DrawImage(bmp1, rectDestination, 0, 0, srcWidth, srcHeight, GraphicsUnit.Pixel);
                bmp.Save(ConfigurationManager.AppSettings["sitePath"] + directoryName + fileName, jgpEncoder, myEncoderParameters);

            }
            else
            {
                bmp1.Save(ConfigurationManager.AppSettings["sitePath"] + directoryName + fileName, jgpEncoder, myEncoderParameters);
            }
            bmp1.Dispose();

            //File.Delete(ConfigurationManager.AppSettings["sitePath"] + ConfigurationManager.AppSettings["imagesPath"] + _archivo);
            //_archivo = nuevoId0.ToString() + "." + extencion;
            //_tamano = (int)new FileInfo(ConfigurationManager.AppSettings["sitePath"] + directoryName + archivo).Length;

        }


        public void OptimizarImagen(Stream streamFile)
        {
            DateTime fecha = fechaCreacion;
            ResizeImage(streamFile, archivo, ConfigurationManager.AppSettings["imagesPath"] + fecha.Year + "/" + fecha.Month + "/" + fecha.Day + "/", Convert.ToInt32(ConfigurationManager.AppSettings["ImagenAnchoMaximo"]));

        }


        public void Delete()
        {
            string queryString = "";
            queryString = "DELETE FROM IMAGENES WHERE id='" + this.id + "'";
            ConexionDBInterna.ExecuteCommand(queryString);

        }
        #endregion


        #region Private Methods
        private void GetRecord(string queryString)
        {
            OdbcDataReader reader = ConexionDBInterna.ExecuteReader(queryString);
            if (reader.HasRows)
            {
                if (!reader.IsDBNull(reader.GetOrdinal("id")))
                    id = (System.Int32)reader["id"];
                if (!reader.IsDBNull(reader.GetOrdinal("fechaCreacion")))
                    fechaCreacion = Convert.ToDateTime(reader["fechaCreacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("fechaModificacion")))
                    fechaModificacion = Convert.ToDateTime(reader["fechaModificacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuario")))
                    idUsuario = (System.Int32)reader["idUsuario"];
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuarioModificacion")))
                    idUsuarioModificacion = (System.Int32)reader["idUsuarioModificacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("titulo")))
                    titulo = (System.String)reader["titulo"];
                if (!reader.IsDBNull(reader.GetOrdinal("descripcion")))
                    descripcion = (System.String)reader["descripcion"];
                if (!reader.IsDBNull(reader.GetOrdinal("archivo")))
                    archivo = (System.String)reader["archivo"];
                if (!reader.IsDBNull(reader.GetOrdinal("tamano")))
                    tamano = (System.Int32)reader["tamano"];
                if (!reader.IsDBNull(reader.GetOrdinal("idCategoria")))
                    idCategoria = (System.Int32)reader["idCategoria"];
                if (!reader.IsDBNull(reader.GetOrdinal("aspecto")))
                    aspecto = (System.Int32)reader["aspecto"];
            }
        }


        private void GetRecord(DataRow dataRow)
        {
            if (dataRow != null)
            {
                if (dataRow["id"] != null)
                    id = (System.Int32)dataRow["id"];
                if (dataRow["fechaCreacion"] != null)
                    fechaCreacion = (System.DateTime)dataRow["fechaCreacion"];
                if (dataRow["fechaModificacion"] != null)
                    fechaModificacion = (System.DateTime)dataRow["fechaModificacion"];
                if (dataRow["idUsuario"] != null)
                    idUsuario = (System.Int32)dataRow["idUsuario"];
                if (dataRow["idUsuarioModificacion"] != null)
                    idUsuarioModificacion = (System.Int32)dataRow["idUsuarioModificacion"];
                if (dataRow["titulo"] != null)
                    titulo = (System.String)dataRow["titulo"];
                if (dataRow["descripcion"] != null)
                    descripcion = (System.String)dataRow["descripcion"];
                if (dataRow["archivo"] != null)
                    archivo = (System.String)dataRow["archivo"];
                if (dataRow["tamano"] != null)
                    tamano = (System.Int32)dataRow["tamano"];
                if (dataRow["idCategoria"] != null)
                    idCategoria = (System.Int32)dataRow["idCategoria"];
                if (dataRow["aspecto"] != null)
                    aspecto = (System.Int32)dataRow["aspecto"];
            }
        }


        protected override void UpdateBind()
        {
            StringBuilder strCommand = new StringBuilder();
            strCommand.Append("UPDATE IMAGENES set ");
            strCommand.Append("fechaModificacion='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",idUsuarioModificacion='" + this.idUsuarioModificacion.ToString() + "'");
            strCommand.Append(",titulo=\"" + WLMFunctions.comillas(titulo) + "\"");
            strCommand.Append(",descripcion=\"" + WLMFunctions.comillas(descripcion) + "\"");
            strCommand.Append(",archivo=\"" + WLMFunctions.comillas(archivo) + "\"");
            strCommand.Append(",tamano='" + this.tamano.ToString() + "'");
            strCommand.Append(",idCategoria='" + this.idCategoria.ToString() + "'");
            strCommand.Append(",aspecto='" + this.aspecto.ToString() + "'");
            strCommand.Append(" WHERE id='" + this.id + "'");
            ConexionDBInterna.ExecuteCommand(strCommand.ToString());
        }
        #endregion
    }




    public class ImagenCollection
    {

        private List<MediaImage> _items;
        public List<MediaImage> Elementos { get; set; }
        public ImagenCollection()
        {
        }
        public ImagenCollection(ref dbConnector ConexionDB)
        {
            ;
            string strCommand = "SELECT id FROM IMAGENES ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            Elementos = new List<MediaImage>();
            while (dataReader.Read())
            {
                MediaImage newItem = new MediaImage(Convert.ToInt32(dataReader["id"]), ref ConexionDB);
                Elementos.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }
    }
}
